package com.fin.zw.intelligentbot.service;

import com.fin.zw.intelligentbot.entity.Company;
import com.fin.zw.intelligentbot.entity.QCompany;
import com.fin.zw.intelligentbot.entity.UserInfo;
import com.fin.zw.intelligentbot.enums.SourceType;
import com.fin.zw.intelligentbot.enums.Whether;
import com.fin.zw.intelligentbot.model.response.RoleInfoResponse;
import com.fin.zw.intelligentbot.model.session.SessionModel;
import com.fin.zw.intelligentbot.repository.CompanyRepository;
import com.fin.zw.intelligentbot.repository.UserInfoRepository;
import com.google.common.collect.Sets;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service("commonService")
public class CommonService {

    @Autowired
    private CompanyRepository companyRepository;

    @Autowired
    private UserInfoRepository userInfoRepository;

    /**
     * 判断当前登录人是否是管理员（包含多种角色）
     * @param sessionModel
     * @return
     */
    public boolean whetherAdmin(SessionModel sessionModel){
        boolean result = false;
        Set<RoleInfoResponse> set = sessionModel.getRoleInfoSet();
        set.stream().filter(role -> role.getWhether().equals(Whether.YES)).collect(Collectors.toSet());
        if (set != null && !set.isEmpty()) {
            result = true;
        }
        return result;
    }

    /**
     * 获取当前登录人所在公司信息
     * @param sessionModel
     * @return
     */
    public Company getCompany(SessionModel sessionModel){
        if (StringUtils.isNotEmpty(sessionModel.getCompanyId())) {
            return companyRepository.findById(sessionModel.getCompanyId()).orElse(new Company());
        }
        return null;
    }

    /**
     * 服务管理端查询对应的企业信息，如果是企业方，则查询自己的企业信息
     * @param sessionModel
     * @param companyIds
     * @return
     */
    public Set<Company> getCompanySet(SessionModel sessionModel,List<String> companyIds){
        Set<Company> set = new HashSet<>();
        if (StringUtils.isEmpty(sessionModel.getCompanyId())) {
            if(companyIds != null && !companyIds.isEmpty()){
                Iterator<Company> iterable = companyRepository.findAll(QCompany.company.id.in(companyIds)).iterator();
                set.addAll(Sets.newHashSet(iterable));
            }
        }else{
            set.add(getCompany(sessionModel));
        }
        return set;
    }

    /**
     * 获取当前登录人用户信息
     * @param sessionModel
     * @return
     */
    public UserInfo getUserInfo(SessionModel sessionModel){
        if (StringUtils.isNotEmpty(sessionModel.getUserId())) {
            return userInfoRepository.findById(sessionModel.getUserId()).orElse(new UserInfo());
        }
        return null;
    }

    /**
     * 修改权限的判断
     * @param sessionModel
     * @param sourceType
     * @return
     */
    public String exitSource(SessionModel sessionModel, SourceType sourceType){
        String result = null;
        if (StringUtils.isEmpty(sessionModel.getCompanyId())) { //来源管理端
            if(sourceType.equals(SourceType.COMPANY)){
                result = "管理端不允许修改企业数据";
            }
        }else { //来源于企业
            if(sourceType.equals(SourceType.SAFEMANAGER)){
                result = "企业不允许修改管理端的数据";
            }
        }
        return result;
    }
}
